import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * 案例：
 * * 需求：写一个"框架"，不能改变该类的任何代码的前提下，可以帮我们创建任意类的对象，并且执行其中任意方法
 * * 实现：
 * 1. 配置文件
 * 2. 反射
 * * 步骤：
 * 1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
 * 2. 在程序中加载读取配置文件
 * 3. 使用反射技术来加载类文件进内存，创建Class对象
 * 4. 通过Class对象创建对象
 * 5. 执行方法
 */
public class ReflectTest {
    public static void main(String[] args) {
        try {
            //1.创建Properties对象
            Properties prop = new Properties();
            //2.加载配置文件
            //通过类加载器获得src目录的路径
            ClassLoader classLoader = ReflectTest.class.getClassLoader();
            prop.load(classLoader.getResourceAsStream("config.properties"));
            //3.获取配置文件中的数据(类名和方法名)
            String className = prop.getProperty("className");
            String methodName = prop.getProperty("methodName");
            //4.加载该类进内存，创建Class对象
            Class cls = Class.forName(className);
            //5.创建对象
            Object o = cls.newInstance();
            //6.获取方法对象
            Method method = cls.getMethod(methodName);
            //7.执行方法
            method.invoke(o);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}
